package wxuser

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
	"wxuser-boot/config"
	"wxuser-boot/entity"
	"wxuser-boot/utils"
)

// CreateUser
// @Summary 创建新用户
// @Description 根据提供的用户信息创建一个新用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param user body entity.WxUser true "用户信息"
// @Success 200 {object} map[string]interface{} "操作成功"
// @Failure 400 {object} map[string]interface{} "参数错误"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
//
// @Security BearerAuth
//
// @Router /admin/wxUser/add [post]
func CreateUser(c *gin.Context) {
	var user entity.WxUser
	err := c.BindJSON(&user)
	if err != nil {
		utils.Result(c, false, "参数不能为空", http.StatusInternalServerError, nil)
		return
	}
	if utils.IsEmpty(c, user.ID, "ID不能为空") {
		return
	}
	if utils.IsEmpty(c, user.Username, "Username不能为空") {
		return
	}
	if utils.IsEmpty(c, user.AppId, "AppId不能为空") {
		return
	}
	if user.CreateTime == "" {
		user.CreateTime = time.Now().Format(time.DateTime)
	}
	var existingUser entity.WxUser
	// 查询数据库中是否存在相同用户名
	resultFirst := config.Db.Where("username = ? AND app_id = ?", user.Username, user.AppId).First(&existingUser)
	if resultFirst.Error != nil {
		resultCreate := config.Db.Create(&user)
		if resultCreate.Error != nil {
			// 如果插入失败，返回错误信息
			utils.Result(c, false, "创建用户失败", http.StatusInternalServerError, resultCreate.Error.Error())
			return
		}
		utils.Result(c, true, "操作成功", http.StatusOK, nil)
	} else {
		utils.Result(c, false, "用户已存在", http.StatusInternalServerError, nil)
	}
}

// GetUser 根据id查询用户
// @Summary 获取指定ID的用户信息
// @Description 根据用户ID查询并返回用户信息
// @Tags 用户管理
// @Accept  json
// @Produce  json
// @Param id path string true "用户ID"
//
// @Security BearerAuth
//
// @Router /admin/wxUser/getUser/{id} [get]
func GetUser(c *gin.Context) {
	id := c.Param("id")
	var user entity.WxUser
	result := config.Db.First(&user, id)
	if result.Error != nil {
		utils.Result(c, false, "用户不存在", http.StatusInternalServerError, nil)
		return
	}
	utils.Result(c, true, "操作成功", http.StatusOK, user)
}

// QueryByName 根据username查询用户
//
// @Summary 根据用户名查询用户信息
// @Description 通过提供的用户名查询用户详细信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param userName query string true "用户名"
// @Success 200 {object} utils.Response{data=[]entity.WxUser} "操作成功"
// @Failure 500 {object} utils.Response "内部服务器错误"
//
// @Security BearerAuth
//
// @Router /admin/wxUser/queryByName [get]
func QueryByName(c *gin.Context) {
	username := c.Query("userName")
	sortBy := c.DefaultQuery("sortBy", "app_id")
	order := c.DefaultQuery("order", "desc")
	// 如果参数为空，可以返回错误
	if username == "" {
		utils.Result(c, false, "查询用户失败", http.StatusInternalServerError, "用户名是必需的！！！")
		return
	}
	var user []entity.WxUser
	query := config.Db.Where("username = ?", username)
	// 添加排序逻辑
	if order == "desc" {
		query = query.Order(fmt.Sprintf("%s DESC", sortBy))
	} else {
		query = query.Order(sortBy)
	}
	query.Find(&user)
	if len(user) == 0 {
		utils.Result(c, true, "", http.StatusOK, nil)
		return
	}
	utils.Result(c, true, "操作成功", http.StatusOK, user)
}

// UpdateUser 修改用户
//
//	@Summary      更新用户信息
//	@Description  根据提供的用户ID更新用户详细信息
//	@Tags         用户管理
//	@Accept       json
//	@Produce      json
//	@Param        user  body  entity.WxUser  true  "用户信息"
//	@Success      200  {object}  utils.Response{data=string}  "操作成功"
//	@Failure      400  {object}  utils.Response  "参数错误或不能为空"
//	@Failure      500  {object}  utils.Response  "服务器内部错误"
//
// @Security BearerAuth
//
//	@Router       /admin/wxUser/update [put]
func UpdateUser(c *gin.Context) {
	var user entity.WxUser
	err := c.BindJSON(&user)
	if err != nil {
		utils.Result(c, false, "参数不能为空", http.StatusInternalServerError, nil)
		return
	}
	if user.ID == "" {
		utils.Result(c, false, "ID不能为空", http.StatusInternalServerError, nil)
		return
	}
	if user.Username == "" {
		utils.Result(c, false, "Username不能为空", http.StatusInternalServerError, nil)
		return
	}
	if user.AppId == "" {
		utils.Result(c, false, "AppId不能为空", http.StatusInternalServerError, nil)
		return
	}
	result := config.Db.First(&user, user.ID)
	if result.Error != nil {
		utils.Result(c, false, "用户不存在", http.StatusInternalServerError, nil)
		return
	}
	resultSave := config.Db.Save(&user)
	if resultSave.Error != nil {
		utils.Result(c, false, "修改用户失败", http.StatusInternalServerError, resultSave.Error.Error())
		return
	}
	utils.Result(c, true, "操作成功", http.StatusOK, nil)
}

// DeleteUser 删除用户
//
//	@Summary      根据ID删除用户
//	@Description  使用提供的用户ID来删除指定用户
//	@Tags         用户管理
//	@Accept       json
//	@Produce      json
//	@Param        id  path  string  true  "用户ID"
//	@Success      200  {object}  utils.Response{data=int}  "操作成功"
//	@Failure      400  {object}  utils.Response  "参数错误或不能为空"
//	@Failure      500  {object}  utils.Response  "服务器内部错误"
//
// @Security BearerAuth
//
//	@Router       /admin/wxUser/delete/{id} [delete]
func DeleteUser(c *gin.Context) {
	// 从URL参数中获取用户ID
	id := c.Param("id")
	// 定义用户结构体变量
	var user entity.WxUser
	// 查询数据库中是否存在指定ID的用户
	result := config.Db.First(&user, id)
	if result.Error != nil {
		// 如果查询失败，返回用户不存在的错误
		utils.Result(c, false, "用户不存在", http.StatusInternalServerError, nil)
		return
	}
	// 删除查找到的用户
	utils.Result(c, true, "操作成功", http.StatusOK, config.Db.Delete(&user).RowsAffected)
}

// DeleteUserByUserNameAndAppId 根据用户名和应用ID删除用户
//
//	@Summary      根据用户名和应用ID删除用户
//	@Description  使用提供的用户名和应用ID来删除指定用户
//	@Tags         用户管理
//	@Accept       json
//	@Produce      json
//	@Param        username  query  string  true  "用户名"
//	@Param        appid     query  string  true  "应用ID"
//	@Success      200  {object}  utils.Response{data=int}  "操作成功"
//	@Failure      400  {object}  utils.Response  "参数错误或不能为空"
//	@Failure      500  {object}  utils.Response  "服务器内部错误"
//
// @Security BearerAuth
//
//	@Router       /admin/wxUser/deleteUserByUserNameAndAppId [delete]
func DeleteUserByUserNameAndAppId(c *gin.Context) {
	// 从请求参数中获取用户名和应用ID
	username := c.Query("username")
	appid := c.Query("appid")
	// 定义用户结构体变量
	var user entity.WxUser

	// 查询数据库中是否存在指定用户名和应用ID的用户
	result := config.Db.Where("username = ? AND app_id = ?", username, appid).First(&user)
	if result.Error != nil {
		// 如果查询失败，返回用户不存在的错误
		utils.Result(c, false, "用户不存在", http.StatusInternalServerError, nil)
		return
	}
	// 删除查找到的用户
	utils.Result(c, true, "操作成功", http.StatusOK, config.Db.Delete(&user).RowsAffected)
}
